package org.dromara.tearoom.controller;

import cn.hutool.core.lang.Assert;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.dromara.common.area.core.Area;
import org.dromara.common.area.core.enums.AreaTypeEnum;
import org.dromara.common.area.core.utils.AreaUtils;
import org.dromara.common.area.core.utils.IPUtils;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.utils.BeanUtils;
import org.dromara.tearoom.domain.vo.AreaNodeRespVO;
import org.dromara.common.core.domain.vo.CityVo;
import org.dromara.common.core.utils.PinYinUtil;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 地区管理
 * @author CKJ
 * @description: 地区管理
 * @date 2025/6/11 11:01
 */
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/area")
public class AreaController {

    /**
     * 获得地区树
     * @return
     */
    @GetMapping("/tree")
    public R<List<AreaNodeRespVO>> getAreaTree() {
        Area area = AreaUtils.getArea(Area.ID_CHINA);
        Assert.notNull(area, "获取不到中国");
        return R.ok(BeanUtils.toBean(area.getChildren(), AreaNodeRespVO.class));
    }


    /**
     * 获得 IP 对应的地区名
     * @param ip
     * @return
     */
    @GetMapping("/getByIp")
    public R<String> getAreaByIp(@RequestParam("ip") String ip) {
        // 获得城市
        Area area = IPUtils.getArea(ip);
        if (area == null) {
            return R.fail("未知");
        }
        // 格式化返回
        return R.ok("查询成功",AreaUtils.format(area.getId()));
    }

    /**
     * 获得 ID 对应的地区名
     * @param ids
     * @return
     */
    @GetMapping("/getById")
    public R<String> getAreaById(@RequestParam("ids") String ids) {
        return R.ok("查询成功",AreaUtils.formatAreaIdString(ids,"/"));
    }

    /**
     * 获取中国所有城市列表
     *
     * 响应示例：
     * [{"id":110100,"name":"北京市"},{"id":310100,"name":"上海市"},...]
     */
    @GetMapping("/china/cityList")
    public R<List<CityVo>> getChinaCities() {
        // 获取所有类型为城市的区域
        List<Area> allCities = AreaUtils.getByType(AreaTypeEnum.CITY, Function.identity());
        // 过滤出中国的城市（递归向上查找直到国家节点）
        return R.ok(allCities.stream()
            .filter(city -> {
                Area parent = city;
                while (parent != null) {
                    if (parent.getId().equals(Area.ID_CHINA)) {
                        return true;
                    }
                    parent = parent.getParent();
                }
                return false;
            })
            .map(city -> new CityVo(city.getId(), city.getName(), PinYinUtil.getCityPinyinInitials(city.getName())))
            .collect(Collectors.toList()));
    }


}
